package frsf.cidisi.exercise.tp1.search;

import frsf.cidisi.exercise.tp1.utiles.MetodosUtiles;
import frsf.cidisi.faia.solver.search.IEstimatedCostFunction;
import frsf.cidisi.faia.solver.search.NTree;

/**
 * This class allows to define a function to be used by any
 * informed search strategy, like A Star or Greedy.
 */
public class Heuristic implements IEstimatedCostFunction {

	double pesoMaximoAcoplado;
	
	double pesoPorUnidadOro;
	double pesoPorUnidadRubi;
	double pesoPorUnidadAnillo;
	double pesoPorUnidadDiamante;
	double pesoPorUnidadColgante;
	
	double ponderacionPesoTesoro;
	
	MetodosUtiles metodosUtiles = new MetodosUtiles();
	
    /**
     * It returns the estimated cost to reach the goal from a NTree node.
     */
//    @Override
    public double getEstimatedCost(NTree node) {
    	
        EstadoActualArqueologo agState = (EstadoActualArqueologo) node.getAgentState();
       
        double costo;

        //TODO: Harcoded objetivo!
		       
//        System.out.println("Parametros: "+agState.getPosicionEnMapa()[agState.getPosicionAgente()-1][0]+" "+agState.getPosicionEnMapa()[agState.getPosicionAgente()-1][1]+"-- "+ agState.getPosicionEnMapa()[5][0]+" "+agState.getPosicionEnMapa()[5][1]);
        double costoDistancia = metodosUtiles.distanciaEnLineaRecta(agState.getPosicionEnMapa()[agState.getPosicionAgente()-1], agState.getPosicionEnMapa()[5]);
		
        double costoTesoro = (metodosUtiles.calcularPeso(agState.getTesoros()[agState.getPosicionAgente()-1])+1)*ponderacionPesoTesoro;
//		
		costo = (costoDistancia)/(costoTesoro);

		//TODO: Borrar
//		System.out.println("Posicion: "+agState.getPosicionAgente()+" -- CostoDistancia: "+costoDistancia+" -- CostoTesoro: "+/*costoTesoro*/" -- CostoFinal: "+costo);
		
		return costo;
    }
    
	public double getPesoMaximoAcoplado() {
		return pesoMaximoAcoplado;
	}

	public void setPesoMaximoAcoplado(double pesoMaximoAcoplado) {
		this.pesoMaximoAcoplado = pesoMaximoAcoplado;
	}

	public double getPesoPorUnidadOro() {
		return pesoPorUnidadOro;
	}

	public void setPesoPorUnidadOro(double pesoPorUnidadOro) {
		this.pesoPorUnidadOro = pesoPorUnidadOro;
	}

	public double getPesoPorUnidadRubi() {
		return pesoPorUnidadRubi;
	}

	public void setPesoPorUnidadRubi(double pesoPorUnidadRubi) {
		this.pesoPorUnidadRubi = pesoPorUnidadRubi;
	}

	public double getPesoPorUnidadAnillo() {
		return pesoPorUnidadAnillo;
	}

	public void setPesoPorUnidadAnillo(double pesoPorUnidadAnillo) {
		this.pesoPorUnidadAnillo = pesoPorUnidadAnillo;
	}

	public double getPesoPorUnidadDiamante() {
		return pesoPorUnidadDiamante;
	}

	public void setPesoPorUnidadDiamante(double pesoPorUnidadDiamante) {
		this.pesoPorUnidadDiamante = pesoPorUnidadDiamante;
	}

	public double getPesoPorUnidadColgante() {
		return pesoPorUnidadColgante;
	}

	public void setPesoPorUnidadColgante(double pesoPorUnidadColgante) {
		this.pesoPorUnidadColgante = pesoPorUnidadColgante;
	}

	public double getPonderacionPesoTesoro() {
		return ponderacionPesoTesoro;
	}

	public void setPonderacionPesoTesoro(double ponderacionPesoTesoro) {
		this.ponderacionPesoTesoro = ponderacionPesoTesoro;
	}

	public MetodosUtiles getMetodosUtiles() {
		return metodosUtiles;
	}

	public void setMetodosUtiles(MetodosUtiles metodosUtiles) {
		this.metodosUtiles = metodosUtiles;
	}
    
    
}
